require 'byebug'

AioRoot = File.join(__dir__, '..', '..', '..')
AioFile = File.join(__dir__, '..', '..', '..','lib', 'aio.rb')
load AioFile

class AioInit

  InputFile = File.join(__dir__, '..', '..', 'test_input_file')

  attr_accessor :device_manager

  class << self

    def root
      AioRoot
    end
  end

  def initialize
    # 返回device_manager
    aio_parse_console(InputFile)
  end

  def aio_input_module(mod_name)
    @aio_input_klass = @module_manager.get_module_klass_by_name(mod_name)
  end

  def aio_output_module(mod_name)
    @aio_output_klass = @module_manager.get_module_klass_by_name(mod_name)
  end

  def aio_input_parse(input_file)
    @aio_input_klass.input_file = input_file
    @parser.input_klass = @aio_input_klass
    @aio_input_klass.ext_info = {cmds_reg: @device_manager.just_cmds_reg}

    @parser.parse_by_module
    @parser
  end

  def aio_output_parse(output_file)
    @aio_output_klass.output_file = output_file
    @aio_output_klass.device_manager = @device_manager
    @aio_output_klass.generate

    # 返回最终的生成文件名
    return @aio_output_klass.output_file
  end

  def aio_parse(input_file, output_file=nil)
    aio_input_parse(input_file)
    aio_output_parse(output_file) unless output_file.nil?
    @device_manager
  end

  # 分析console类型的文件，返回device_manager
  def aio_parse_console(file)
    aio_init
    aio_input_module('input/style/console')
    aio_parse(file)
  end

  private

  def aio_init
    @module_manager = Aio::ModuleManager.new
    module_loader = Aio::Module::Loader.new(@module_manager)
    module_loader.load_modules(module_loader.modules_path)

    @device_manager = Aio::DeviceManager.new(@module_manager)
    parser_machine = Aio::Parse::ParserMachine.new(@device_manager)
    @parser = Aio::Parse::Parser.new(@device_manager, parser_machine)

    # 每次清空日志
    Aio::Ui::Logger.instance.clear_log
  end
end

#`ruby -Ilib -e 'ARGV.each { |f| require f }' ./minitest/module/*/*.rb`
